/**
 * @name: 常用函数
 */
import Vue from 'vue'
import {Message} from "element-ui";
import {http} from "@/utils/http";
import {getToken} from "@/utils/auth";

const mimeMap = {
	xlsx: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
	zip: 'application/zip'
}
export function downLoadZip(url, data) {
	http({
		method: 'get',
		url: url,
		data,
		responseType: 'blob',
		// headers: { 'Authorization': 'Bearer ' + getToken() }
	}).then(res => {
		resolveBlob(res, mimeMap.zip)
	})
}
/**
 * 解析blob响应内容并下载
 * @param {*} res blob响应内容
 * @param {String} mimeType MIME类型
 */
export function resolveBlob(res, mimeType) {
	const aLink = document.createElement('a')
	var blob = new Blob([res.data], { type: mimeType })
	// //从response的headers中获取filename, 后端response.setHeader("Content-disposition", "attachment; filename=xxxx.docx") 设置的文件名;
	var patt = new RegExp('filename=([^;]+\\.[^\\.;]+);*')
	var contentDisposition = decodeURI(res.headers['content-disposition'])
	var result = patt.exec(contentDisposition)
	var fileName = result[1]
	fileName = fileName.replace(/\"/g, '')
	aLink.href = URL.createObjectURL(blob)
	aLink.setAttribute('download', fileName) // 设置下载文件名称
	document.body.appendChild(aLink)
	aLink.click()
	document.body.appendChild(aLink)
}
/**
 *  加注机代数判断 旧板子为v1 4G改版为v2 新板子为v3
 * */
export function interfaceVersion(macType) {
	console.log(['MacType1'].includes(macType))
	if(['MacType1'].includes(macType)) {
		return 'v3'
	} else if (['MacType2'].includes(macType)) {
		return 'v2'
	} else if(['MacType3','MacType4','MacType5','MacType6','MacType7'].includes(macType)) {
		return 'v1'
	} else {
		return "v3"
	}
}

/**
 *  手机号正则
 * */
export function isPhoneNum(str) {
	return /^1[3456789]\d{9}$/.test(str)
}
/**
 * input输入框整数限制
 * <el-input v-model.number="val" @keydown.native="inputIntLimit" type="number">
 */
export function inputIntLimit(e) {
	let key = e.key
	// 不允许输入'e'和'.'
	if (key === 'e' || key === '.') {
		e.preventDefault()
		e.returnValue = false
		return false
	}
	return true
}

export function filterHiddenRoutes(routes) {
	return routes.filter(route => {
		if(route.children) {
			route.children = filterHiddenRoutes(route.children)
		}
		return !route.hidden
	})
}

/**
 * @param {string} path
 * @returns {Boolean}
 */
export function isExternal(path) {
	return /^(https?:|mailto:|tel:)/.test(path)
}

/**
 * @param {Array} arr 选中的区域编号
 * 如果只选择省份，则返回省份编号
 * 如果选择了城市，则返回城市编号
 */
function dealAreaCode(arr) {
	let code = arr[0];
	if(arr.length > 2 && arr[1] !== '' && arr[1] !== undefined && arr[1] !== null) {
		code = arr[1];
	}

	return code;
}

Vue.prototype.$dealAreaCode = dealAreaCode;

//将数组转为逗号分隔的字符串
function arrToStr(arr) {
	let str = JSON.stringify(arr);
	str = str.replace(/\[/g, '');
	str = str.replace(/\]/g, '');
	return str.replace(/"/g, '');
}

Vue.prototype.$arrToStr = arrToStr;

//将省市编码数组整理为编码字符串
function areaToCode(arr) {
	if(arr.length === 1 || arr[1] == '') {
		return arr[0].replace(/"/g, '');
	} else {
		return arrToStr(arr);
	}
}

Vue.prototype.$areaToCode = areaToCode;

/**
 * @name 获取日期
 * @param {String} type 'm'-当前月份
 * 						's'-开始日期(当前月份第一天)
 * 						'e'-结束日期(今天)
 */
function getDate(type) {
	// var d = new Date();
	// var ye = d.getFullYear();
	let date = new Date();
	var mo = (date.getMonth()+1).toString().padStart(2,'0');//自动补零
	var da = date.getDate().toString().padStart(2,'0');
	// var time = ye+'-'+mo+'-'+da;
	//
	let y = date.getFullYear();
	let m = mo;
	let d = da;
	let str = y + '-' + m;
	switch(type) {
		case 's': str = str+'-01'; break;
		case 'e': str = str + '-' + d; break;
	}
	return str;

	// let date = new Date();
	// let y = date.getFullYear();
	// let m = date.getMonth() + 1;
	// let d = date.getDate();
	// let str = y + '-' + m;
	// switch(type) {
	// 	case 's': str = str + '-1'; break;
	// 	case 'e': str = str + '-' + d; break;
	// }
	// return str;
}

Vue.prototype.$getDate = getDate;

//el-table滚动加载下一页
Vue.directive('loadmore', {
	bind(el, binding) {
		const selectWrap = el.querySelector('.el-table__body-wrapper')
		selectWrap.addEventListener('scroll', function() {
			let sign = 0
			const scrollDistance = this.scrollHeight - this.scrollTop - this.clientHeight
			if (scrollDistance <= sign) {
				binding.value()
			}
		})
	}
});


//乘法函数的浮点数误差
function accMul(arg1,arg2)
{
	var m=0,s1=arg1.toString(),s2=arg2.toString();
	try{m+=s1.split(".")[1].length}catch(e){}
	try{m+=s2.split(".")[1].length}catch(e){}
	return Number(s1.replace(".",""))*Number(s2.replace(".",""))/Math.pow(10,m)
}

Vue.prototype.$accMul = accMul;

/**
 ** 加法函数，用来得到精确的加法结果
 ** 说明：javascript的加法结果会有误差，在两个浮点数相加的时候会比较明显。这个函数返回较为精确的加法结果。
 ** 调用：accAdd(arg1,arg2)
 ** 返回值：arg1加上arg2的精确结果
 **/
function accAdd(arg1, arg2) {
    var r1, r2, m, c;
    try {
        r1 = arg1.toString().split(".")[1].length;
    }
    catch (e) {
        r1 = 0;
    }
    try {
        r2 = arg2.toString().split(".")[1].length;
    }
    catch (e) {
        r2 = 0;
    }
    c = Math.abs(r1 - r2);
    m = Math.pow(10, Math.max(r1, r2));
    if (c > 0) {
        var cm = Math.pow(10, c);
        if (r1 > r2) {
            arg1 = Number(arg1.toString().replace(".", ""));
            arg2 = Number(arg2.toString().replace(".", "")) * cm;
        } else {
            arg1 = Number(arg1.toString().replace(".", "")) * cm;
            arg2 = Number(arg2.toString().replace(".", ""));
        }
    } else {
        arg1 = Number(arg1.toString().replace(".", ""));
        arg2 = Number(arg2.toString().replace(".", ""));
    }
    return (arg1 + arg2) / m;
}

Vue.prototype.$accAdd = accAdd;


//策略模式表单校验封装 <校验事件的实现><别处去调用这个校验事件时，要用throw去抛出去，然后调用的事件外面用try去捕获>
let formCheckFunc={
	isEmpty:function (value) {
		//object or  string--进行判断<该方法进行了单个字段和对象的判断>
		if(typeof(value) === 'string' && value ===''){
			throw Message.warning('请输入完整表单内容');
		}else if(typeof(value) === 'object' && value.length === undefined){
			//<对象进入--判断对象的全部属性是否为空--有为空的则返回>
			for(let pro of Object.entries(value)){
				if(pro[1] === ''){throw  Message.warning(`请输入${pro[0]}`)}
				if(typeof(pro[1] === 'object' && value.length === undefined)){
					//<这里用了递归--用于判断多层对象的场景>
					this.isEmpty(pro[1])
				}
			}
		}else{
			return '请传入正确的校验数据类型string or {}'
		}
	},
	isMobile:function (value) {
		if(!(/^1[3456789]\d{9}$/.test(value))){
			console.log(1)
			throw Message.warning('请输入正确的手机号');
		}
	}
}
//校验事件的调用
class Formsub{
	constructor(value,length,errorMsg) {
		this.value = value;
		this.length = length;
		this.errorMsg = errorMsg;
	}
}
Formsub.prototype.checkAny=function (checkFunc,value) {
	//formCheckFunc为算法的实现-不暴露在外--类的实例checkany方法根据传入的checkFunc去匹配方法进行校验
	//该暴露方法主要是为了后期校验方法的增加--去匹配--不需要在暴露的class方法中再增加事件-只需在算法的实现中去增加校验事件
	return  formCheckFunc[checkFunc](value);
}
Formsub.prototype.checkEmpty = function(value){
	return formCheckFunc.isEmpty(value);
}
let checkOne = new Formsub();
Vue.prototype.$formCheck = checkOne;


